训练一个分割器
本指南介绍如何设置和配置 OV20i 的分割功能,以自动检测、测量和分析部件中的特定特征或缺陷。需要识别不规则形状、测量面积,或检测无法通过简单分类处理的特征时,请使用分割。
备注
Ov10i 不具备分割功能。
何时使用分割: 表面缺陷、液体溢漏、不规则形状、面积测量、图案检测,或任何需要像素级精确度的特征。
开始前
您需要的内容
- 已设置并连接的 OV20i 摄像系统
- 带有要分割特征的测试件(例如带铅笔标记的薄片)
- 适用于您特定应用的良好照明条件
- 15-20 张用于训练的示例图像
第 1 步:创建分割配方
1.1 新建配方
- 打开“All Recipes”页面
- 点击
+ New Recipe
(右上角) - 输入配方名称:使用描述性名称,如 "Pencil_Mark_Detection" 或 "Surface_Defect_Segmentation"
- 选择配方类型:从下拉菜单中选择 "Segmentation"
- 点击
OK
以创建
1.2 激活配方
- 在列表中找到您的配方(显示为“Inactive”)
- 点击
Actions > Activate
- 点击
Activate
以确认
✅ 结果:配方现已处于激活状态,可进行配置。
第 2 步:访问配方编辑器
- 点击您已激活配方旁边的 Edit
- 点击 Open Editor 以确认
您现在将看到带有分割相关选项的配方编辑器。
第 3 步:配置相机设置
3.1 打开成像配置
- 点击
Configure Imaging
(左下角)
3.2 为分割优化对焦
对边缘检测的准确性,聚焦至关重要:
- 将测试件放置在相机视图中
- 调整对焦,直到边缘清晰锐利
- 对不同工件进行测试,以确保在整个范围内对焦一致
提示
- 将焦点放在缺陷/特征将出现的表面
- 确保感兴趣区域的整个区域处于清晰对焦
- 对分割而言,略微过度锐化比软焦更佳
3.3 设置最佳曝光
正确曝光可确保特征检测的一致性:
- 调整曝光,以实现均衡照明
- 避免过曝区域(纯白区域)
- 在良好对比度下确保特征可见
分割曝光指南:
- 特征应与背景具有清晰对比
- 避免可能被误认为缺陷的阴影
- 使用各种工件条件进行测试(清洁、污脏、磨损)
3.4 配置 LED 照明模式
根据要分割的对象选择照明:
特征类型 | 推荐照明 | 原因 |
---|---|---|
表面缺陷 | 明场照明 | 均匀照明显示表面不规则性 |
划痕/裂纹 | 侧光照明 | 阴影突出线性缺陷 |
凸起特征 | 暗场照明 | 使凸起区域从背景中突出 |
液体溢出 | 侧光照明 | 显示表面纹理差异 |
3.5 调整伽马以提升特征对比度
- 提高伽马值以增强特征与背景之间的对比度
- 在查看目标特征时测试不同的伽马值
- 找到使特征最易区分的设置
3.6 保存配置
- 在实时预览中查看设置
- 点击
Save Imaging Settings
✅ 检查点: 特征在对比度良好时应清晰可见。
第 4 步:设置模板和对齐
4.1 导航至模板部分
点击 "Template Image and Alignment" 在面包屑菜单中
4.2 配置对齐(可选)
在本示例中,我们将跳过对齐:
- 如果零件位置保持一致,请选择
Skip Aligner
- 点击
Save
何时使用 Aligner: 当零件到达的位置或方向不同,可能影响分割的准确性时启用。
第 5 步:定义检测区域
5.1 导航至 检测设置
点击 "Inspection Setup" 在面包屑导航中
5.2 设置 ROI(感兴趣区域)
ROI 定义了分割将发生的位置:
- 将测试件放置在相机视图中
- 拖动 ROI 的角点以框定检测区域
- 适当设置 ROI 大小:
- 包含可能出现特征的所有区域
- 排除不必要的背景区域
- 在预期特征位置周围留出缓冲区
5.3 用于分割的 ROI 最佳实践
执行 | 不执行 |
---|---|
覆盖整个检测表面 | 包含无关背景对象 |
在边缘留出缓冲区 | 使 ROI 对特征变化过小 |
考虑零件定位变化 | 与夹具或工具的定位重叠 |
使用最大预期特征进行测试 | 包含带永久标记的区域 |
5.4 保存 ROI 设置
- 验证 ROI 覆盖所有目标区域
- 点击
Save
第 6 步:标注训练数据
6.1 导航至 标注与训练
点击 "Label And Train" 在面包屑导航中
6.2 配置检测类别
- 在检测类型下点击
Edit
- 将类别重命名以匹配您的特征(例如 "Pencil Mark"、"Surface Defect"、"Spill Area")
- 选择类别颜色以便可视化识别
- 保存更改
6.3 捕获并标注训练图像
您需要至少 10 张带标注的图像,但建议 15-20 张:
图像捕获过程
- 将第一件测试件放置在检测区域
- 使用相机界面拍摄图像
- 使用画笔工具在目标特征上进行着色
- 准确着色:
- 覆盖整个特征区域
- 保持在特征边界内
- 不要涂抹背景区域
- 使用一致的标注方法
- 点击
Save Annotations
- 对下一个零件重复
标注最佳实践
良好标注 | 不良标注 |
---|---|
特征边界精准 | 边缘涂抹粗糙 |
特征定义一致 | 标准不一致 |
特征覆盖全面 | 缺失特征区域 |
背景干净(未涂色) | 背景涂色意外覆盖 |
6.4 训练数据多样性
确保你的训练集包含:
- 不同的特征尺寸
- 不同的特征强度
- ROI 内的多个位置
- 不同的光照条件(如适用)
- 边缘情况和界线示例
6.5 质量检查训练数据
- 审查所有标注的图像
- 验证标注方法的一致性
- 删除任何标注错误的示例
- 如有需要,添加更多示例
步骤 7:训练 Segmentation Model
7.1 开始训练过程
- 点击
Return to Live
,标注完成后 - 点击
Train Segmentation Model
7.2 配置训练参数
- 设置迭代次数:
- 快速训练: 50-100 次迭代(5-10 分钟)
- 生产质量: 200-500 次迭代(15-30 分钟)
- 高精度: 500+ 次迭代(30+ 分钟)
- 点击
Start Training
7.3 监控训练进度
训练进度显示:
- 当前迭代次数
- 训练准确率百分比
- 预计完成时间
训练控件:
- Abort Training: 如出现问题时停止
- Finish Training Early: 当准确度足够时停止
提示
- 85% 准确率通常适用于生产环境
- 训练在达到目标准确度时自动停止
- 更多训练数据通常比更多迭代更有效
步骤 8:测试分割性能
8.1 访问实时预览
- 点击
Live Preview
,训练完成后 - 对不同部件进行测试:
- 已知良品部件(应显示无/极少分割)
- 已知不良部件(应突出显示缺陷)
- 边缘情况和界线示例
8.2 评估结果
检查分割质量:
指标 | 良好表现 | 需改进 |
---|---|---|
准确性 | 始终发现真实特征 | 容易遗漏明显特征 |
精确度 | 偶发假阳性较少 | 许多背景区域被高亮显示 |
边缘质量 | 较干净、准确的边界 | 较粗糙或不准确的边缘 |
一致性 | 重复测试结果相似 | 结果变化很大 |
8.3 不良结果的排查
问题 | 可能原因 | 解决方案 |
---|---|---|
缺少特征 | 训练数据不足 | 添加更多已标注的示例 |
假阳性 | 光照/对比度不足 | 提高成像设置 |
边缘粗糙 | 图像质量差 | 提高对焦/照明 |
结果不一致 | 训练样本多样性不足 | 增加更多多样化示例 |
第 9 步:配置 Pass/Fail Logic
9.1 Access IO Block
- 确保 AI 模型显示绿色(训练完成状态)
- 通过面包屑导航进入 IO Block
9.2 Remove Default Logic
- 删除 Classification Block Logic 节点
- 准备构建自定义分割逻辑
9.3 Build Segmentation Flow
Create Node-RED flow with these components:
- 从左侧面板拖拽节点:
- Function node(用于逻辑)
- Debug node(用于测试)
- Final Pass/Fail node
- 用连线将节点连接起来
9.4 Configure Logic Based on Your Needs
选项 A:若未检测到缺陷则通过
用例: 质量检测中任一检测到的特征均视为不合格
Function Node Code:
const allBlobs = msg.payload.segmentation.blobs;
const results = allBlobs.length <1; // Pass if no features found
msg.payload = results;
return msg;
选项 B:仅在缺陷较小时通过
用例: 接受小于尺寸阈值的次要缺陷
Function Node Code:
const threshold = 500; // Adjust pixel count threshold
const allBlobs = msg.payload.segmentation.blobs;
const allUnderThreshold = allBlobs.every(blob => blob.pixel_count < threshold);
msg.payload = allUnderThreshold;
return msg;
选项 C:若总缺陷面积较小时通过
用例: 接受总缺陷面积有限的部件
Function Node Code:
const threshold = 5000; // Adjust total pixel threshold
const allBlobs = msg.payload.segmentation.blobs;
const totalArea = allBlobs.reduce((sum, blob) => sum + blob.pixel_count, 0);
msg.payload = totalArea < threshold;
return msg;
9.5 Configure Function Node
- 双击 Function node
- 从以上示例中复制合适的代码
- 粘贴到 "On Message" 选项卡
- 为你的应用调整阈值
- 点击
Done
9.6 Deploy and Test Logic
- 点击
Deploy
以激活逻辑 - 进入 HMI 进行测试
- 使用已知良品和不良品进行测试
- 验证通过/失败结果是否符合预期
Step 10: Production Validation
10.1 Comprehensive Testing
使用以下进行分割系统测试:
测试用例 | 预期结果 | 失败时行动 |
---|---|---|
清洁部件 | 通过(无分割) | 调整阈值或重新训练 |
小缺陷 | 根据您的标准通过/不通过 | 精炼逻辑参数 |
重大缺陷 | 失败(清晰分割) | 检查模型精度 |
边缘情况 | 行为一致 | 添加训练数据 |
10.2 Performance Validation
监控以下指标:
- 每次检测的处理时间
- 多次测试的一致性
- 生产照明下的准确性
- 长时间运行的可靠性
10.3 Final Adjustments
若性能不令人满意:
- 为边缘情况添加更多训练数据
- 在逻辑中调整阈值
- 改善成像条件
- 在额外迭代中重新训练模型
成功!您的 Segmentation System 已就绪
您现在拥有一个可工作的 segmentation system,能够:
- 自动检测 特定特征或缺陷
- 以像素级精度测量面积
- 根据您的需求应用自定义 Pass/Fail Logic
- 通过 I/O 控制与生产系统集成
高级配置选项
自定义阈值逻辑
对于复杂的验收标准,组合多个条件:
const smallThreshold = 200;
const largeThreshold = 1000;
const maxTotalArea = 3000;
const allBlobs = msg.payload.segmentation.blobs;
const smallBlobs = allBlobs.filter(blob => blob.pixel_count < smallThreshold);
const largeBlobs = allBlobs.filter(blob => blob.pixel_count > largeThreshold);
const totalArea = allBlobs.reduce((sum, blob) => sum + blob.pixel_c